﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace SCGILite.Helper
{
    static class HttpStatusCodeDesc
    {
        static Dictionary<int, string> dict = new Dictionary<int, string>();
        static HttpStatusCodeDesc()
        {
            //1xx: Information
            dict[100] = "Continue";            //The server has received the request headers, and the client should proceed to send the request body
            dict[101] = "Switching Protocols"; //The requester has asked the server to switch protocols
            dict[103] = "Checkpoint";          //Used in the resumable requests proposal to resume aborted PUT or POST requests
            //2xx: Successful
            dict[200] = "OK";                  //The request is OK (this is the standard response for successful HTTP requests)
            dict[201] = "Created";             //The request has been fulfilled, and a new resource is created 
            dict[202] = "Accepted";            //The request has been accepted for processing, but the processing has not been completed
            dict[203] = "Non-Authoritative";   //Information	The request has been successfully processed, but is returning information that may be from another source
            dict[204] = "No Content";          //The request has been successfully processed, but is not returning any content
            dict[205] = "Reset Content";       //The request has been successfully processed, but is not returning any content, and requires that the requester reset the document view
            dict[206] = "Partial Content";     //The server is delivering only part of the resource due to a range header sent by the client
            //3xx: Redirection
            dict[300] = "Multiple Choices";    //A link list. The user can select a link and go to that location. Maximum five addresses  
            dict[301] = "Moved Permanently";   //The requested page has moved to a new URL 
            dict[302] = "Found";               //The requested page has moved temporarily to a new URL 
            dict[303] = "See Other";           //The requested page can be found under a different URL
            dict[304] = "Not Modified";        //Indicates the requested page has not been modified since last requested
            dict[306] = "Switch Proxy";        //No longer used
            dict[307] = "Temporary Redirect";  //The requested page has moved temporarily to a new URL
            dict[308] = "Resume Incomplete";   //Used in the resumable requests proposal to resume aborted PUT or POST requests
            //4xx: Client Error
            dict[400] = "Bad Request";         //The request cannot be fulfilled due to bad syntax
            dict[401] = "Unauthorized";        //The request was a legal request, but the server is refusing to respond to it. For use when authentication is possible but has failed or not yet been provided
            dict[402] = "Payment Required";    //Reserved for future use
            dict[403] = "Forbidden";           //The request was a legal request, but the server is refusing to respond to it
            dict[404] = "Not Found";           //The requested page could not be found but may be available again in the future
            dict[405] = "Method Not Allowed";  //A request was made of a page using a request method not supported by that page
            dict[406] = "Not Acceptable";      //The server can only generate a response that is not accepted by the client
            dict[407] = "Proxy Authentication Required";//The client must first authenticate itself with the proxy
            dict[408] = "Request Timeout";     //The server timed out waiting for the request
            dict[409] = "Conflict";            //The request could not be completed because of a conflict in the request
            dict[410] = "Gone";                //The requested page is no longer available
            dict[411] = "Length Required";     //The "Content-Length" is not defined. The server will not accept the request without it 
            dict[412] = "Precondition Failed"; //The precondition given in the request evaluated to false by the server
            dict[413] = "Request Entity Too Large";//The server will not accept the request, because the request entity is too large
            dict[414] = "Request-URI Too Long";//The server will not accept the request, because the URL is too long. Occurs when you convert a POST request to a GET request with a long query information 
            dict[415] = "Unsupported Media Type";//The server will not accept the request, because the media type is not supported 
            dict[416] = "Requested Range Not Satisfiable";//The client has asked for a portion of the file, but the server cannot supply that portion
            dict[417] = "Expectation Failed";  //The server cannot meet the requirements of the Expect request-header field
            //5xx: Server Error
            dict[500] = "Internal Server Error";//A generic error message, given when no more specific message is suitable
            dict[501] = "Not Implemented";    //The server either does not recognize the request method, or it lacks the ability to fulfill the request
            dict[502] = "Bad Gateway";        //The server was acting as a gateway or proxy and received an invalid response from the upstream server
            dict[503] = "Service Unavailable";//The server is currently unavailable (overloaded or down)
            dict[504] = "Gateway Timeout";    //The server was acting as a gateway or proxy and did not receive a timely response from the upstream server
            dict[505] = "HTTP Version Not Supported";//The server does not support the HTTP protocol version used in the request
            dict[511] = "Network Authentication Required";//The client needs to authenticate to gain network access
        }

        public static string ToStatusString(int code)
        {
            string s = "";
            if (dict.TryGetValue(code, out s))
            {
                return code + " " + s;
            }
            return "200 OK";
        }
    }
}
